
Imports System.IO
Imports PowerTools

Public Class AjouterEditerFichier
    Private EnAjout As Boolean = False
    Private NoeudsModifies As New Dictionary(Of TreeNode, String)
    Private Sub cmdAnnuler_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAnnuler.Click
        Me.Close()
    End Sub

    Private Sub cmdCharger_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCharger.Click
        If (Not Me.ValidateChildren()) Then
            Return
        End If
        Me.Close()
    End Sub

    Private Sub AjouterEditerFichier_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        MettrePaletteCourante(KryptonPaletteCardsGen)
    End Sub

    Public Function Ajouter() As Fichier
        Dim Fichier As New Fichier
        Fichier.ContenuXml = New PouvoirsXML
        Fichier.Actif = True
        EnAjout = True
        Me.Size = New Size(344, 324)
        If Modifier(Fichier) = DialogResult.OK Then

            Dim nomfichier As String = Fichier.ContenuXml.Titre
            For Each c As Char In Path.GetInvalidFileNameChars
                nomfichier = nomfichier.Replace(c, "")
            Next
            Dim nomFinal As String = Path.Combine(Chargements.CheminXMLs, nomfichier)
            If File.Exists(nomFinal + ".xml") Then
                Dim r As New Random
                nomFinal = nomFinal + r.Next(10000).ToString("0000")
            End If
            Fichier.CheminComplet = nomFinal + ".xml"
            If Not Fichier.Sauver() Then
                MessageBox.Show(String.Format("Sauvegarde du nouveau fichier {0} imposssible !", Fichier.CheminComplet), "Erreur de sauvegarde", MessageBoxButtons.OK, MessageBoxIcon.Error)
                Return Nothing
            End If
            Return Fichier
        End If
        Return Nothing
    End Function

    Public Function Modifier(ByVal fichier As Fichier) As DialogResult
        AfficheFichier(fichier, True)
        ShowDialog()
        If Me.DialogResult = DialogResult.OK Then
            SauverDansFichier(fichier)
            fichier.IsDirty = True
        End If
        Return Me.DialogResult
    End Function

    Public Function Sauver(ByVal fichier As Fichier) As DialogResult
        AfficheFichier(fichier, True)
        ShowDialog()
        If Me.DialogResult = DialogResult.OK Then
            SauverDansFichier(fichier)
            If Not fichier.Sauver Then
                MessageBox.Show(String.Format("Sauvegarde du  fichier {0} imposssible !", fichier.CheminComplet), "Erreur de sauvegarde", MessageBoxButtons.OK, MessageBoxIcon.Error)
                Return Nothing
            End If
        End If
        Return Me.DialogResult
    End Function

    Private Sub AfficheFichier(ByVal fichier As Fichier, Optional AfficherArbre As Boolean = False)
        txtVersion.Text = fichier.ContenuXml.Version
        txtLogVersion.Text = fichier.ContenuXml.Log
        txtTitre.Text = fichier.ContenuXml.Titre
        txtCreePar.Text = fichier.ContenuXml.Par
        If AfficherArbre Then
            Dim noeud As TreeNode
            trvContenu.Nodes.Clear()

            For Each manuel In fichier.ContenuXml.manuel
                noeud = trvContenu.Nodes.Add(manuel.nom_livre)
                noeud.Tag = manuel.nom_livre
                For Each classe In manuel.classe
                    Dim NC As TreeNode = noeud.Nodes.Add(classe.ToString())
                    NC.Tag = classe
                Next
            Next
            lvwModifs.Items.Clear()
            For Each capacite In fichier.CapacitesModifiees.OrderBy(Function(c As PowerTools.PouvoirsXMLPouvoir) c.nom)
                Dim li As ListViewItem = lvwModifs.Items.Add(capacite.nom)
                li.SubItems.Add(capacite.Modifie.ToString())
            Next
        End If
    End Sub

    Private Sub SauverDansFichier(ByVal fichier As Fichier)
        With fichier.ContenuXml
            fichier.ContenuXml.Version = txtVersion.Text.Trim()
            fichier.ContenuXml.Par = txtCreePar.Text.Trim()
            fichier.ContenuXml.Titre = txtTitre.Text.Trim()
            fichier.ContenuXml.Log = txtLogVersion.Text.Trim()
            For Each kv As KeyValuePair(Of TreeNode, String) In NoeudsModifies
                Dim n As TreeNode = kv.Key.Parent
                Dim cle As KeyValuePair(Of TreeNode, String) 'pour eviter : http://msdn.microsoft.com/en-us/library/Bb763133(v=VS.100).aspx
                cle = kv
                If (n Is Nothing) Then ' Manuel
                    .manuel.Single(Function(x) x.nom_livre = cle.Key.Tag).nom_livre = cle.Value
                Else 'contenu
                    Try
                        .manuel.First(Function(x) x.nom_livre = n.Tag.ToString()).classe.First(Function(c) c.ToString() = cle.Key.Tag.To5tring()).VersObjet(cle.Value)
                    Catch Ex As Exception
                        Dim tmp As String = "Impossible de sauver la modification " & kv.Value & Environment.NewLine & "Saisissez comme Guerrier : 20 (implique jusqu'a 20) ou Guerrier : Tous"
                        If (Debugger.IsAttached) Then
                            tmp += Environment.NewLine + Ex.Message
                        End If
                        MessageBox.Show(tmp, "Saisie invalide", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    End Try
                End If
            Next
        End With
    End Sub

    Private Sub Text_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtTitre.Validating, txtCreePar.Validating, txtVersion.Validating
        If (String.IsNullOrEmpty(sender.Text.Trim())) Then
            ErrorProvider1.SetError(sender, "Ce champ ne peut pas etre vide") ', "Erreur de saisie", MessageBoxButtons.OK, MessageBoxIcon.Error))
            sender.Focus()
        End If
    End Sub

    Private Sub txtVersion_TextChanged(sender As System.Object, e As System.EventArgs) Handles txtVersion.TextChanged

    End Sub

    Private Sub txtTitre_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtTitre.TextChanged

    End Sub

    Private Sub trvContenu_AfterLabelEdit(ByVal sender As System.Object, ByVal e As System.Windows.Forms.NodeLabelEditEventArgs) Handles trvContenu.AfterLabelEdit
        NoeudsModifies.Add(e.Node, e.Label.Trim())
    End Sub
End Class
